#include <iostream>

using namespace std;

/*
 * 用法：static_cast <类型说明符> （变量或表达式）
 * 说明：
 * 1.用于类层次结构中基类和派生类之间指针或引用的转换
 * 	1.1.进行上行转换（把派生类的指针或引用转换成基类表示）是安全的
 *  1.2.进行下行转换（把基类的指针或引用转换为派生类表示），由于没有动态类型检查，所以是不安全的
 * 2.用于基本数据类型之间的转换，如把int转换成char。这种转换的安全也要开发人员来保证
 * 3.把空指针转换成目标类型的空指针
 * 4.把任何类型的表达式转换为void类型
 * 注意：
 * 1.static_cast不能转换掉expression的const、volitale或者__unaligned属性。
 * 2.涉及到类的话，static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。
 * */

class Animal{
public:
	char *name;
	void eat()
	{
		cout << "Animal.eat" << endl;
	}
};

class Cat: public Animal{
public:
	void eat()
	{
		cout << "Cat.eat" << endl;
	}

};

int main()
{
	int a = 10;
	int b = 20;

	double ret = (double)a / (double)b;
	cout << "ret: " << ret << endl;

	Animal *animal;
	Cat *cat = new Cat();
	// 子类向父类转换，从下向上，是安全的
	animal = static_cast<Animal *>(cat);
	animal->eat();

	Animal *animal1 = new Animal();
	Cat *cat1;
	// 父类想子类转换，不一定是安全的，但是他们之间存在继承关系，有相同的eat函数，这里是正常的	
	cat1 = static_cast<Cat *>(animal1);
	cat1->eat();

	//delete(cat);
	//delete(animal);

	return 0;
}
